package com.wtb.javatool.dao;

import com.wtb.javatool.dto.ProjectDto;
import com.wtb.javatool.entity.Project;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface ProjectMapper {
    /**
     * 查询所有项目
     *
     * @param userId        用户id，用于筛选于自己相关的项目
     * @param projectName   项目名称
     * @param start         项目日期，开始范围
     * @param end           项目日期，结束范围
     * @param projectType   项目类型
     * @param projectStatus 项目状态
     * @param begin         起始位置
     * @param size          每页大小
     * @return 项目列表
     */
    List<Project> findProjectsByUserId(
            @Param("userId") Long userId,
            @Param("projectName") String projectName,
            @Param("projectType") Integer projectType,
            @Param("projectStatus") Integer projectStatus,
            @Param("start") Long start,
            @Param("end") Long end,
            @Param("begin") Integer begin,
            @Param("size") Integer size
    );

    /**
     * 查询所有项目的个数
     *
     * @param userId        用户id，用于筛选于自己相关的项目
     * @param projectName   项目名称
     * @param start         项目日期，开始范围
     * @param end           项目日期，结束范围
     * @param projectType   项目类型
     * @param projectStatus 项目状态
     * @return 项目个数
     */
    Integer findProjectsByUserIdCount(@Param("userId") Long userId,
                                      @Param("projectName") String projectName,
                                      @Param("projectType") Integer projectType,
                                      @Param("projectStatus") Integer projectStatus,
                                      @Param("start") Long start,
                                      @Param("end") Long end
    );

    ProjectDto findNormalProjectByProjectId(@Param("projectId") Long projectId);

    ProjectDto findTeachingProjectByProjectId(@Param("projectId") Long projectId);

    /**
     * 创建项目实体，并将数据库生成的自增ID设置到传入的Project对象的projectId属性中。
     *
     * @param project 要创建的项目实体。
     */
    void createProject(Project project);


    /**
     * 跟新项目信息。
     *
     * @param project 项目实体。
     */
    void updateProject(Project project);
    
    /**
     * 删除项目。
     *
     * @param projectId 项目ID。
     */
    void deleteProject(@Param("projectId") Long projectId);
    
    /**
     * 删除项目企业关联表中的记录
     *
     * @param projectId 项目ID
     */
    void deleteProjectEnterpriseRef(@Param("projectId") Long projectId);
    
    /**
     * 删除项目管理者关联表中的记录
     * 
     * @param projectId 项目ID
     */
    void deleteProjectManagerRef(@Param("projectId") Long projectId);
    
    /**
     * 删除项目相关的任务
     *
     * @param projectId 项目ID
     */
    void deleteTasksByProjectId(@Param("projectId") Long projectId);
    
    /**
     * 删除项目相关的产线
     *
     * @param projectId 项目ID
     */
    void deleteLinesByProjectId(@Param("projectId") Long projectId);

    /**
     * 根据课程ID查询关联的项目
     *
     * @param courseId 课程ID
     * @param projectName 项目名称（可选，用于过滤）
     * @param projectStatus 项目状态（可选，用于过滤）
     * @param begin 分页起始位置
     * @param size 每页大小
     * @return 项目列表
     */
    List<Project> findProjectsByCourseId(
            @Param("courseId") Long courseId,
            @Param("projectName") String projectName,
            @Param("projectStatus") Integer projectStatus,
            @Param("begin") Integer begin,
            @Param("size") Integer size
    );

    /**
     * 统计课程关联的项目数量
     *
     * @param courseId 课程ID
     * @param projectName 项目名称（可选，用于过滤）
     * @param projectStatus 项目状态（可选，用于过滤）
     * @return 项目数量
     */
    Integer findProjectsByCourseIdCount(
            @Param("courseId") Long courseId,
            @Param("projectName") String projectName,
            @Param("projectStatus") Integer projectStatus
    );

    /**
     * 查询用户有权限访问但尚未关联到指定课程的项目
     *
     * @param userId 用户ID
     * @param courseId 课程ID
     * @return 可添加的项目列表
     */
    List<Project> findAvailableProjectsForCourse(
            @Param("userId") Long userId,
            @Param("courseId") Long courseId
    );
}
